# 自动取款机

'''
ATM机所需功能
1.用户数据
2.交互界面
3.登录
4.查询
5.取钱
6.存钱
7.退出
'''



# 用户数据
users_data = [
    {'user':'zhangsan','pwd':'zs123','money':1000},
    {'user':'lisi','pwd':'zi123','money':1500},
    {'user':'wangmazi','pwd':'wmz123','money':100},
    {'user':'wangtao','pwd':'wt123','money':8888}
]

# 定义一个空列表，让ATM记住当前登录的用户信息
user_list = []

# 交互界面
def show_face():
    '''

    :return:
    '''
    print('='*33,'ATM操作界面','='*33)
    print('|{:<36}|{:<36}|'.format('1.登录','2.余额'))
    print('-'*78)
    print('|{:<36}|{:<36}|'.format('3.取钱', '4.存钱'))
    print('-' * 78)
    print('|{:<74}|'.format('5.退出'))

# 登录
def login():
    '''
    登录函数
    :return:
    '''
    # 声明user_list为全局变量
    global user_list
    # 等待用户输入自己的账号密码
    key_u = input('请输入用户名：')
    key_p = input('请输入密码：')
    # 用遍历和枚举得到一个索引序列、数据下标
    for i,user_dict in enumerate(users_data):
        # 判断用户输入的账号密码是否存在
        if user_dict['user'] == key_u and user_dict['pwd'] == key_p:
            # 当用户的信息存在后，把索引和user存到user_list列表中
            user_list.append(i)
            user_list.append(user_dict['user'])

    # 判断列表是不是为空
    if user_list != []:
        # 不为空值代表用户输入的用户存在，则提示登陆成功
        print('{:<76}'.format('——————登陆成功——————\n'))
    # 否则就是没有找到用户的数据，代表密码或账户错误
    else:
        # 给用户一个重新输入的入口
        if input('你输入的账号或密码错误，是否重新输入？y/n') == 'y':
            login()

# 退出系统
def logOut():
    '''
    退出函数

    :return:
    '''
    print('='*78)
    print('='*30, '感谢使用，再见！！！','='*29)
    print('='*78)

# 查询余额
def balance():
    '''
    查询函数
    :return:
    '''
    print('='*78)
    print(' '*26,'您的账户余额为{:<8}元!'.format(users_data[user_list[0]]['money']))
    print('='*78)

# 取钱
def draw_money():
    '''
    取钱函数
    :return: 
    '''
    # 当用户输入的不是整数，报错并返回重新调用本函数，报错时使用return组织程序继续往下运行
    key_dm = float(input('请输入您要取款的金额：'))
    # is_integer()判度一个浮点是否为整数，小数为false，判度输入的值是否为整数，整数返回true
    if key_dm.is_integer() == False:
        print('只能输入整数！！！')
        draw_money()
    # 判度余额是否大于取款金额，账户余额充足则执行取款
    if users_data[user_list[0]]['money'] >= key_dm:
        users_data[user_list[0]]['money'] -= key_dm
        print('='*78)
        print(' '*28,'您已成功取款{:<8}元！'.format(key_dm))
        print('='*78)
    else:    # 余额不足时，提示用户“余额不足”
        print('='*78)
        # 使用format占位
        print('{:<78}'.format('余额不足！！！'))
        print('='*78)
        head()

# 存钱
def save_money():
    '''
    存钱函数
    :return:
    '''
    # 当用户输入的不是整数，报错并返回重新调用本函数，报错时使用return组织程序继续往下运行
    key_sm = float(input('请输入您要存款的金额：'))
    # is_integer()判度一个浮点是否为整数，小数为false
    if key_sm.is_integer() == False:
        print('只能输入整数！！！')
        save_money()
    else:   # 把用户输入的整数加到用户数据中，用户数据的定位也来自登入提供的临时列表
        users_data[user_list[0]]['money'] += key_sm
        print('='*78)
        print(' '*28,'您已成功存款{:<8}元！'.format(key_sm))
        print('='*78)
# 总控制函数
def head():
    '''
    界面控制
    :return:
    '''
    while True:
        # 调用界面函数
        show_face()
        key = input('请选择：')
        if key == '1':
            # 判度用户是否登录，已登录则提醒成功，没登录则执行登录
            if user_list != []:
                print('-'*20,'您已登录，如要登录新账户，请先退出！','-'*20)
            else:
                login()
        elif key == '2':
            # 判度用户是否登录，未登录则提醒登录，已登录执行余额函数
            if user_list == []:
                print('='*28,'您尚未登录，请先登录！！！','='*28)
            else:
                balance()
                input('任意键返回！！！')
        elif key == '3':
            # 判度用户是否登录，未登录则提醒登录，已登录执行取钱函数
           if user_list == []:
               print('='*28,'您尚未登录，请先登录！！！','='*28)
           else:
               draw_money()
               input('任意键返回！！！')
        elif key == '4':
            # 判度用户是否登录，未登录则提醒登录，已登录执行存钱函数
            if user_list == []:
                print('=' * 28, '您尚未登录，请先登录！！！', '=' * 28)
            else:
                save_money()
                input('任意键返回！！！')
        elif key == '5':
            # 执行登出函数
            logOut()
            break
        else:   # 如果输入指定意外的案件，提醒有误
            print('输入有误，请重新输入！！！')

head()


